package cn.lyjuan.archetypes.bms.web.service;


import cn.lyjuan.archetypes.bms.common.entity.MgManage;
import cn.lyjuan.archetypes.bms.common.entity.MgRole;
import cn.lyjuan.archetypes.bms.common.mapper.MgRoleMapper;
import cn.lyjuan.archetypes.bms.web.mapper.IWebPrivilegeMapper;
import cn.lyjuan.archetypes.bms.web.util.ErrUtils;
import cn.lyjuan.archetypes.bms.web.util.SuperAdminUtils;
import cn.lyjuan.archetypes.bms.web.mapper.IWebRoleMapper;
import com.github.pagehelper.PageHelper;
import cn.lyjuan.archetypes.bms.common.mapper.MgPrivilegeMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Created by ly on 2015/1/16.
 */
@Service("mgRoleService")
public class RoleService extends BaseService<MgRole>
{
    private static Logger log = LogManager.getLogger(RoleService.class.getName());

    @Autowired
    private MgRoleMapper roleMapper;

    @Autowired
    private MgPrivilegeMapper privilegeMapper;

    @Autowired
    private IWebRoleMapper webRoleMapper;

    @Autowired
    private IWebPrivilegeMapper webPrivilegeMapper;

    /**
     * 查询管理员创建的角色
     *
     * @param roleid
     * @return
     */
    @PostAuthorize("returnObject.createby == principal.username")// 角色创建者
    public MgRole queryRole(Integer roleid)
    {
        // TODO 权限设计有问题
        return roleMapper.selectByPrimaryKey(roleid);
    }

    /**
     * 查询所有角色
     * 如果是超级管理员可以查看所有角色<br />
     * 普通用户只能 (1.查看自己创建的角色（如果有创建角色权限的话）和 (2.自己所属的角色（被用户的创建者分配的角色）<br />
     * @param manage
     * @param param
     * @return
     */
    public List<MgRole> queryRolesForManage(MgManage manage, Map<String, String> param)
    {
        List<MgRole> list = null;

        if (SuperAdminUtils.isSuperManager(manage.getCreateby()))// 超级管理员能查看所有角色
        {
            list = webRoleMapper.selectAllRoles(param);
        } else // 非超级管理员只能查看自己创建的角色和自己所属的角色
        {
            list = webRoleMapper.selectRolesForManage(manage.getId(), param);
        }

        return list;
    }

    /**
     * 查询所有角色
     * 调用 {@link RoleService#queryRolesForManage(MgManage, Map)}
     * @return
     */
    public List<MgRole> queryRolesForManage(MgManage manage, Map<String, String> param, Integer pn, Integer ps)
    {
        PageHelper.startPage(pn, ps);

        List<MgRole> list = queryRolesForManage(manage, param);


        return list;
    }

    /**
     * 管理员创建角色
     *
     * @param manager
     * @param role
     * @return
     */
    public MgRole addRole(MgManage manager, MgRole role)
    {
        // 判断角色名称是否存在
        int nameExist = webRoleMapper.selectRoleCountByName(role.getName());
        if (nameExist > 0)
            ErrUtils.appThrow("角色名称已存在");

        // 创建
        role.setCreatetime(new Date());
        role.setCreateby(manager.getName());
        roleMapper.insert(role);

        return role;
    }

    /**
     * 更新角色信息
     *
     * @param fromRole
     * @param toRole
     * @return
     */
    @PreAuthorize("#fromRole.createby == principal.username")// 角色创建者
    public MgRole saveRole(MgRole fromRole, MgRole toRole)
    {
        if (StringUtils.isEmpty(toRole.getName()))
            throw new IllegalArgumentException("角色名称不能为空");

        if (fromRole.getName().equals(toRole.getName()))
            return fromRole;

        int nameExist = webRoleMapper.selectRoleCountByName(toRole.getName());
        if (nameExist > 0)
            ErrUtils.appThrow("角色名称已存在");

        fromRole.setName(toRole.getName());
        webRoleMapper.updateRoleName(fromRole.getId(), fromRole.getName());

        return fromRole;
    }



    /**
     * 查询用户关联的角色
     *
     * @param manage
     * @return
     */
    public List<MgRole> queryRelatedRole(MgManage manage)
    {
        return webRoleMapper.selectRolesRelated(manage.getId());
    }


}
